﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Business_Layer;
using log4net;
using log4net.Config;
using Data_Access_Layer;

namespace CaffeBillard
{
	public partial class FormEmployee : DevComponents.DotNetBar.Office2007Form
	{
		public FormEmployee()
		{
			InitializeComponent();
			dgvEmployee.AutoGenerateColumns = false;
		}
		#region Khai bao

		private EmployeeController _manager = new EmployeeController();
		private AccountController _accManagrer=new AccountController();
		private bool _allSelecte;
		bool _curr;
		Employee _emp;
		private Utility _com;
		#endregion
		
		protected static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
		/// <summary>
		/// load formEmployee
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void FormEmployee_Load(object sender, EventArgs e)
		{
			
			Binding_Cbb();
			Load_Employee();
			_com=new Utility();	
		}
		#region Ham Bo Tro
		private void Load_Employee()
		{
			dgvEmployee.DataSource = new BindingSource { DataSource = _manager.GetAll() };
		}
		/// <summary>
		/// gán dử liệu cho Cột Sex và Role
		/// </summary>
		private void Binding_Cbb()
		{
			txtKeyWordFind.Enabled = false;
			cbbKindRole.Enabled = false;
			string[] s1 = { "Nam", "Nữ" };
			clSex.Items.Add(s1[0]);
			clSex.Items.Add(s1[1]);
		    cbbKindRole.DataSource = Role.Objects.All; 
            clRoleId.DataSource = Role.Objects.All;
            cbbKindRole.DisplayMember = "RoleName"; 
            clRoleId.DisplayMember = "RoleName";
            cbbKindRole.ValueMember = "Id";
            clRoleId.ValueMember = "Id";

		}
		/// <summary>
		/// sự kiện chọn hết các row của dgvEmployee
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void dgvEmployee_CellClick(object sender, DataGridViewCellEventArgs e)
		{
			if (e.RowIndex == -1)
			{
				if (e.ColumnIndex == 0)
				{
					if (_allSelecte)
					{
						int i = 0;
						dgvEmployee.Rows[0].Cells[0].Value = false;
						do
						{
							dgvEmployee.Rows[i].Cells[0].Value = false;
							i++;
						}
						while (i < dgvEmployee.Rows.Count - 1);

						_allSelecte = false;
					}
					else
					{
						int i = 0;
						dgvEmployee.Rows[0].Cells[0].Value = true;
						do
						{
							dgvEmployee.Rows[i].Cells[0].Value = true;
							i++;
						}
						while (i < dgvEmployee.Rows.Count - 1);

						_allSelecte = true;
					}
				}
			}
		}
		#endregion
		/// <summary>
		/// đổ dữ liệu lên dgvEmployee.
		/// </summary>
		
		/// <summary>
		/// Xóa nhân viên
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>

		private void btnDelete_Click(object sender, EventArgs e)
		{
			XmlConfigurator.Configure();
			log.Info("Nhan vien: Xoa thong tin nhan vien");
			try
			{
				int index = 0;
				var SelectedRows = dgvEmployee.Rows.Cast<DataGridViewRow>().Where(x => x.Cells[1].Value != null && x.Cells[0].Value != null && x.Cells[1].Value.ToString() != "0" && x.Cells[2].Value != null && (bool)x.Cells[0].Value).ToList();

				if (SelectedRows.Count == 0)
				{
					MessageBox.Show("Không có dữ liệu để xóa.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
					Load_Employee();
					return;

				}
				if (MessageBox.Show("Những nhân viên bạn chọn sẽ được xóa, bạn có chắc chắn muốn xóa", "Thông báo", MessageBoxButtons.YesNo) == DialogResult.Yes)
				{
					bool kq = false;
					for (int i = 0; i <= SelectedRows.Count - 1; i++)
					{
						var row = SelectedRows[i].DataBoundItem as Employee;
						if (row.Id == WorkSession.Current.CurrentAccount.EmpId)
						{
							index = i;
							kq = true;
							break;

						}
						else
						{
							kq = false;
						}
					}
					if (kq == true)
					{
						if (MessageBox.Show(
							"Bạn sẽ xóa nhân viên  dang đăng nhập làm quyền Quản Lý, nếu đồng xóa chương trình sẽ  thoát ra và đăng nhập la, Bạn có muốn xóa? ",
							"Thông báo",
							MessageBoxButtons.YesNo) == DialogResult.No)
						{
							for (int i = 0; i <= SelectedRows.Count - 1; i++)
							{
								if (i == index)
									i++;
								if(i<SelectedRows.Count)
								{
									var row = SelectedRows[i].DataBoundItem as Employee;
									row.Deleted = true;
									Account a = new Account();
									a = Account.Objects.FirstOrDefault(x => x.EmpId == row.Id);
									if (a != null)
									{
										a.Deleted = true;
										_accManagrer.Insert_Update(a);
									}
									_manager.Delete(row);
								}
							}
							Load_Employee();
						}
						else
						{
							for (int i = 0; i <= SelectedRows.Count - 1; i++)
							{
								var row = SelectedRows[i].DataBoundItem as Employee;
								row.Deleted = true;
								Account a = new Account();
								a = Account.Objects.FirstOrDefault(x => x.EmpId == row.Id);
								if (a != null)
								{
									a.Deleted = true;
									_accManagrer.Insert_Update(a);
								}
								_manager.Delete(row);
							}
							Load_Employee();
							var login = new FormLogin();
							login.Show();
							foreach (Form form in Application.OpenForms)
							{
								if (form.GetType() == typeof(FormMain))
								{
									form.Hide();
								}
							}
						}
					}
					else
					{
						for (int i = 0; i <= SelectedRows.Count - 1; i++)
						{
							var row = SelectedRows[i].DataBoundItem as Employee;
							row.Deleted = true;
							Account a = new Account();
							a = Account.Objects.FirstOrDefault(x => x.EmpId == row.Id);
							if (a != null)
							{
								a.Deleted = true;
								_accManagrer.Insert_Update(a);
							}
							_manager.Delete(row);
						}
						Load_Employee();

					}
				}
				else
				{
					Load_Employee();
				}

			}
			catch (Exception ex)
			{
				MessageBox.Show("Lỗi : \n" + ex.Message);
				
			}
			
		}

		
		/// <summary>
		/// sự kiện khi đã hoàn thành việc thay đổi trên một cell của dgvEmployee và ra ngoài cell đó.
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void dgvEmployee_RowValidated(object sender, DataGridViewCellEventArgs e)
		{
			
				if (_curr)
				{
					try
					{

						var emp = dgvEmployee.Rows[e.RowIndex];


						if (emp.Cells[1].Value.ToString() == "0")
						{
							XmlConfigurator.Configure();
							log.Info("Nhan vien: Them moi mot nhan vien");
							DateTime? day;
							if (emp.Cells[4].Value != null)
								day = DateTime.Parse(emp.Cells[4].Value.ToString());
							else
								day = null;
							string dc = "";
							if (emp.Cells[5].Value == null)
								dc = "";
							else
							{
								dc = emp.Cells[5].Value.ToString();
							}
							_emp = new Employee
							{
								Name = emp.Cells[2].Value.ToString(),
								SexST = emp.Cells[3].Value.ToString(),
								Birthday = day,
								Address = dc,
								RoleId = int.Parse(emp.Cells[6].Value.ToString()),
								Deleted = false
							};
							if (_emp.RoleId == 0)
							{
								MessageBox.Show("Bạn phải chọn chức vụ  cho nhân viên");
								return;
							}
							if (_manager.Insert_Update(_emp))
							{
								MessageBox.Show("Thêm thành công!!!", "Thông báo", MessageBoxButtons.OK,
												MessageBoxIcon.Information);
								Load_Employee();
							}
							else
							{
								MessageBox.Show("Không thêm được!!!" + _manager._err, "Thông báo", MessageBoxButtons.OK,
												MessageBoxIcon.Information);
							}
						}
						else
						{
							//neu chinh sua chinh nhan vien quan ly dang dang nhap và chuyen thanh cap khác quan li
							XmlConfigurator.Configure();
							log.Info("Nhan vien: Cap nhat thong tin nhan vien");
							_emp = emp.DataBoundItem as Employee;
							if (_emp.Id == WorkSession.Current.CurrentAccount.EmpId && _emp.RoleId != 1)
							{

								if (MessageBox.Show(
									"Nếu bạn chọn đổi phân quyền của bạn từ quyền Quản Lý sang quyền thấp hơn thì chương trình sẽ thoát lần đăng nhập hiện tại và đăng nhập lại, Bạn có muốn thay đổi? ",
									"Thông báo",
									MessageBoxButtons.YesNo) == DialogResult.No)
									Load_Employee();
								else
								{
									if (_manager.Insert_Update(_emp))
									{
										MessageBox.Show("Cập nhật thành công!!!", "Thông báo", MessageBoxButtons.OK,
														MessageBoxIcon.Information);
										//account.Password = dgvAccount.Rows[e.RowIndex].Cells[3].Value.ToString();
										WorkSession.Current.CurrentAccount = Account.Objects.FirstOrDefault(x => x.EmpId == _emp.Id);
										//account = _acc;
										Load_Employee();
										var login = new FormLogin();
										login.Show();
										foreach (Form form in Application.OpenForms)
										{
											if (form.GetType() == typeof(FormMain))
											{
												form.Hide();
											}
										}
									}
									else
									{
										MessageBox.Show("Không cập nhật được!!!" + _manager._err, "Thông báo", MessageBoxButtons.OK,
														MessageBoxIcon.Information);
									}


								}
							}
							else
							{

								if (_manager.Insert_Update(_emp))
								{
									MessageBox.Show("Cập nhật thành công!!!", "Thông báo", MessageBoxButtons.OK,
													MessageBoxIcon.Information);
									if (_emp.Id == WorkSession.Current.CurrentAccount.EmpId)
									{
										WorkSession.Current.CurrentAccount = Account.Objects.FirstOrDefault(x => x.EmpId == _emp.Id);
									}

									Load_Employee();
								}
								else
								{
									MessageBox.Show("Không cập nhật được!!!" + _manager._err, "Thông báo", MessageBoxButtons.OK,
													MessageBoxIcon.Information);
								}
							}

						}
				
					}
					catch (Exception ex)
					{
						MessageBox.Show("Lỗi:...\n" + ex.Message);
					}

				}

			
			_curr = false;

			
		}
		
		/// <summary>
		/// sự kiện khi đang thay đổi thông tin trên một cell của  dgvEmployee.
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void dgvEmployee_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
		{
			try
			{
					if (dgvEmployee.IsCurrentRowDirty && e.ColumnIndex > 0)
					{
				
							var emp = dgvEmployee.Rows[e.RowIndex];
							if (emp.Cells[2].Value == null)
							{

								MessageBox.Show("Không được bỏ trống dử liệu", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning

								);
								e.Cancel = true;
							}
					}
			 }
			catch (Exception ex)
			{
				MessageBox.Show("Lỗi hệ thống:");
			}
			if (dgvEmployee.IsCurrentRowDirty && e.ColumnIndex != 0)
				_curr = true;
			else
			{
				_curr = false;
			}
		}
		/// <summary>
		/// sự kiện chọn kiểu tìm kiếm trên combobox.
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void cbbTypeFind_SelectedIndexChanged(object sender, EventArgs e)
		{
			if(cbbFindType.Text=="Tất cả")
                dgvEmployee.DataSource = new BindingSource { DataSource = _manager.GetAll() };
			//Tìm kiếm theo chức vụTìm Theo Mã
			if (cbbTypeFind.Text == "Tìm Kiếm Theo Tên" || cbbTypeFind.Text == "Tìm Theo Mã")
			{
				txtKeyWordFind.Enabled = true;
				cbbKindRole.Enabled = false;
				cbbKindRole.Text = "";
			}
			else
			{
				txtKeyWordFind.Enabled = false;
				cbbKindRole.Enabled = true;
				txtKeyWordFind.Text = "";
			}
		}
		/// <summary>
		/// sự kiện tìm kiếm khi thay đổi key word trên textbox.
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void txtKeyWordFind_TextChanged(object sender, EventArgs e)
		{
			int n = 0;
			XmlConfigurator.Configure();
			log.Info("Nhan vien: Tim kiem thong tin nhan vien");
			if (cbbTypeFind.Text == "Tìm Theo Mã")
			{

				if (txtKeyWordFind.Text == "")
					Load_Employee();
				if (int.TryParse(txtKeyWordFind.Text, out n))
					dgvEmployee.DataSource = new BindingSource { DataSource = _manager.FindById(n) };
			}
			else
			{
				if (cbbTypeFind.Text == "Tìm Kiếm Theo Tên")
				{
					if (txtKeyWordFind.Text == "")
						Load_Employee();
					else
					{
						dgvEmployee.DataSource = new BindingSource {DataSource = _manager.FindByName(txtKeyWordFind.Text)};
					}
				}
			}
		}
		/// <summary>
		/// sự kiện chọn chức vụ trên combobox.
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void cbbKindRole_SelectedIndexChanged(object sender, EventArgs e)
		{
			XmlConfigurator.Configure();
			log.Info("Nhan vien: Tìm kiếm thông tin nhân viên");
		    int n = 0;
            if(int.TryParse(cbbKindRole.SelectedValue.ToString(),out n))
                dgvEmployee.DataSource = new BindingSource { DataSource = _manager.FindByRole(int.Parse(cbbKindRole.SelectedValue.ToString())) };
		}

		/// <summary>
		/// Xuất danh sách nhân viên
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>

		private void btnPrint_employ_Click(object sender, EventArgs e)
		{
			
			CustomEx ex = new CustomEx();
			ex.Show();
			ex.FormClosed +=ExOnFormClosed;
		}
		/// <summary>
		/// delegate khi đã đóng đóng form CustomEx.
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="formClosedEventArgs"></param>
		private void ExOnFormClosed(object sender, FormClosedEventArgs formClosedEventArgs)
		{
			if (CustomEx.Hz.type == 2)
			{
				XmlConfigurator.Configure();
				log.Info("Nhan vien: Xuat danh sach nhân viên ra PDF");
				ExportEmployeePDF();
			}
			else
			{
				if (CustomEx.Hz.type == 1)
				{
					XmlConfigurator.Configure();
					log.Info("Nhan vien: Xuat danh sach nhân viên ra Excel");
					ExportEmployeeExcel();
				}
				else
				{
					return;
				}
			}
		}
		/// <summary>
		/// Hàm lưu datagridview sang PDF
		/// </summary>
		private void ExportEmployeePDF()
		{
			saveFileDialog1.Filter = "(*.PDF)|*.PDF";
			saveFileDialog1.FileName = "*.PDF";
			if (dgvEmployee.Rows.Count - 1 == 0)
				MessageBox.Show("Không có dữ liệu đễ xuất");
			else
			{
				if (saveFileDialog1.ShowDialog() == DialogResult.OK)
					_com.ExportToPDF(dgvEmployee, saveFileDialog1.FileName);
				

			}
		}
		/// <summary>
		/// Hàm lưu datagridview sang Excel
		/// </summary>
		private void ExportEmployeeExcel()
		{
			saveFileDialog1.Filter = "(*.xls;*.xlsx)|*.xls;*.xlsx";
			saveFileDialog1.FileName = ".xlsx";
			if (dgvEmployee.Rows.Count - 1 == 0)
				MessageBox.Show("Không có dòng nào để xuất");
			else
			{
				if(saveFileDialog1.ShowDialog()==DialogResult.OK)
					_com.ExportToExcel(dgvEmployee,saveFileDialog1.FileName);
			}

		}
 
	}	
}
